#	Makefile for Alkindi Middleware
#

#	Package Names
#
pkg_root 		= 	Alkindi
data_pkg 		= 	Data
services_pkg 	= 	Services
svcimpl_pkg		=	ServicesImpl
internaldata_pkg = 	InternalData
beaniface_pkg 	= 	BeanIface
beanimpl_pkg 	= 	BeanImpl
beanstub_pkg 	= 	StubBeanImpl
util_pkg		=	Util
client_pkg		=	Client

#	Directory Names
#
SRCROOT=$(CURDIR)
CLASSDIR=../classes
LIBDIR=../lib
DOCDIR=$(CURDIR)/../doc

#	Include standard rules
#
include stdrules.mk

data_dir=$(pkg_root)/$(data_pkg)
services_dir=$(pkg_root)/$(services_pkg)
svcimpl_dir=$(pkg_root)/$(services_pkg)/$(svcimpl_pkg)
internaldata_dir=$(pkg_root)/$(services_pkg)/$(internaldata_pkg)
util_dir=$(pkg_root)/$(services_pkg)/$(util_pkg)
beaniface_dir=$(pkg_root)/$(services_pkg)/$(beaniface_pkg)
beanimpl_dir=$(pkg_root)/$(services_pkg)/$(beanimpl_pkg)
beanstub_dir=$(pkg_root)/$(services_pkg)/$(beanstub_pkg)
client_dir=$(pkg_root)/$(services_pkg)/$(client_pkg)

metainf_dir=META-INF


PACKAGE_DIRS:=$(data_dir) $(services_dir) $(util_dir)  $(beaniface_dir) $(beanimpl_dir) $(beanstub_dir) $(metainf_dir) $(client_dir) $(svcimpl_dir) $(internaldata_dir)

#	Source & Target lists for all packages
#
data_sources=$(wildcard $(data_dir)/*.java)
data_targets=$(subst .java,.class,$(data_sources))

services_sources=$(wildcard $(services_dir)/*.java)
services_targets=$(subst .java,.class,$(services_sources))

svcimpl_sources=$(wildcard $(svcimpl_dir)/*.java)
svcimpl_targets=$(subst .java,.class,$(svcimpl_sources))

internaldata_sources=$(wildcard $(internaldata_dir)/*.java)
internaldata_targets=$(subst .java,.class,$(internaldata_sources))

beaniface_sources=$(wildcard $(beaniface_dir)/*.java)
beaniface_targets=$(subst .java,.class,$(beaniface_sources))

beanimpl_sources=$(wildcard $(beanimpl_dir)/*.java)
beanimpl_targets=$(subst .java,.class,$(beanimpl_sources))

beanstub_sources=$(wildcard $(beanstub_dir)/*.java)
beanstub_targets=$(subst .java,.class,$(beanstub_sources))

util_sources=$(wildcard $(util_dir)/*.java)
util_targets=$(subst .java,.class,$(util_sources))

client_sources=$(wildcard $(client_dir)/*.java)
client_targets=$(subst .java,.class,$(client_sources))

#	Archive files
#
beanimpl_jar=$(LIBDIR)/alkindi_mw_server.jar
beansclient_jar=$(LIBDIR)/alkindi_mw_client.jar
beanstub_jar=$(LIBDIR)/alkindi_mw_stub.jar
#app_ear=$(LIBDIR)/alkindi_mw_server.ear

#	Default Rule
#
default: all

#	General directory rule
#
$(CLASSDIR) $(LIBDIR) $(DOCDIR):
	mkdir $@

$(metainf_dir) : $(CLASSDIR) 
	mkdir -p $(CLASSDIR)/$(metainf_dir)

#	Rules to make libs (jars).
#

#	The Enterprise Application Archive contains the EJB implementation 
#	and a special descriptor file.
#
#$(app_ear) : $(beanimpl_jar)
#	cd $(LIBDIR) && jar -cf $(app_ear) alkindi_mw_server.jar 
#	cd $(CLASSDIR) && jar -uf $(app_ear) $(metainf_dir)/application.xml
#	chmod g+w $@
	
#	The Bean Implementation jar contains all generated classes.
#
$(beanimpl_jar) : $(LIBDIR) svcimpl beanimpl util 
	@echo target = $@
	cd $(CLASSDIR) && $(JAR) -cf $(beanimpl_jar) $(pkg_root) $(metainf_dir)
	chmod g+w $@

#	The Client jar contains just the data types and interfaces, 
#	plus the stuff in the Client package.
#	
$(beansclient_jar) : $(LIBDIR) beaniface clientstuff
	@echo target = $@
	cd $(CLASSDIR) && $(JAR) -cf $(beansclient_jar) $(data_dir) $(services_dir)/*.class $(beaniface_dir)/*.class $(client_dir)/*.class
	chmod g+w $@

#	The beanstub jar contains the stub implementations of the 
#	service interfaces. 
#
$(beanstub_jar) : $(LIBDIR) beanstub
	@echo target = $@
	cd $(CLASSDIR) && $(JAR) -cf $(beanstub_jar) $(beanstub_dir)
	chmod g+w $@

clientjar: $(beansclient_jar)

serverjar: $(beanimpl_jar)

stubjar: $(beanstub_jar)

libs : $(LIBDIR) $(beansclient_jar) $(beanimpl_jar) $(beanstub_jar) #$(app_ear)
 
# Dummy target to force making packages 
#
dummy:

#	Dependencies for business data types
#
data: $(data_dir) $(data_targets) showconfig 
	
#	Dependencies for business services
#
services: $(services_dir) $(services_targets)

#	Dependencies for service implementation
#
svcimpl: util internaldata $(svcimpl_dir) $(svcimpl_targets) 

#	Dependencies for internal data
#
internaldata: $(internaldata_dir) $(internaldata_targets)

#	Dependencies for server utilities
#
util : $(util_dir) $(util_targets)

#	Dependencies for EJB interfaces (used for both client and server).
#
beaniface: data services $(beaniface_dir) $(beaniface_targets)

#	Dependencies for EJB server code
#
beanimpl : beaniface metainf util $(beanimpl_dir) $(beanimpl_targets)

#	General EJB target dependencies.
#
beans: beaniface beanimpl

#	Dependencies for stub implementations of the service interfaces.
#
beanstub: data services $(beanstub_dir) $(beanstub_targets)

#	Dependencies for client service stuff.
#
clientstuff: data services beaniface $(client_dir) $(client_targets)

#	Rule to make META-INF dir for EJBs
#
metainf: $(metainf_dir)
	cp $(metainf_dir)/*.xml $(CLASSDIR)/$(metainf_dir)
	
#	General 'all rule
#	
all: data services util beans beanstub libs clientstuff
	@echo Target: $@

#	General 'clean' rule
#
clean: 
	for subdir in $(PACKAGE_DIRS); do rm -rf $(CLASSDIR)/$$subdir/*.class && rm -f $(CLASSDIR)/$$subdir/*.xml; done

deploy : libs 
	cp $(beanimpl_jar) /alkindi/jBoss/deploy

docs: $(DOCDIR)
	$(SUN_JAVA_HOME)/bin/javadoc -classpath $(J2EE_HOME)/lib/j2ee.jar:$(CLASSPATH) -doctitle "Alkindi Java Middleware" -windowtitle "Alkindi Java Middleware" -d $(DOCDIR) $(pkg_root).$(data_pkg) $(pkg_root).$(services_pkg) $(pkg_root).$(services_pkg).$(svcimpl_pkg) $(pkg_root).$(services_pkg).$(internaldata_pkg) $(pkg_root).$(services_pkg).$(util_pkg) $(pkg_root).$(services_pkg).$(beaniface_pkg) $(pkg_root).$(services_pkg).$(beanimpl_pkg) $(pkg_root).$(services_pkg).$(beanstub_pkg)

config:
	@echo classpath = $(CLASSPATH)
	@echo jdk = $(JAVA_HOME)
	@echo package dirs: $(foreach d,$(PACKAGE_DIRS),$(CLASSDIR)/$(d))
